Tengo un wehook ejecutándose en mi clúster.
Creé un certificado y lo firmé con éxito.
configuración del certificado:
cat > csr.conf <<EOF [req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = s-controller.ns-controller DNS.2 = s-controller.ns-controller.svc EOFLes creo el certificado de la siguiente manera:
openssl genrsa -out server-key.pem 2048 openssl req -new -key server-key.pem -subj "/CN=s-controller.ns-controller.svc" -out server.csr -config csr.conf solicitud de firma de certificado ( v1beta1 )
cat <<EOF | kubectl create -f - apiVersion: certificates.k8s.io/v1beta1 kind: CertificateSigningRequest metadata: name: csr-controller spec: groups: - system:authenticated request: $(cat server.csr | base64 | tr -d '\n') usages: - digital signature - key encipherment - server auth EOF¡Esto funcionó bien!
Desde que actualicé mi versión de kubernetes, recibo la siguiente advertencia: Warning: certificates.k8s.io/v1beta1 CertificateSigningRequest is deprecated in v1.19+, unavailable in v1.22+; use certificates.k8s.io/v1 , actualicé CertificateSigningRequest , por lo que ahora es el siguiente:
cat <<EOF | kubectl create -f - apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: csr-controller spec: groups: - system:authenticated request: $(cat server.csr | base64 | tr -d '\n') signerName: kubernetes.io/kube-apiserver-client usages: - digital signature - key encipherment - client auth EOF Y ahora el servidor API no se conecta a mi webhook: Post "https://s-controller.ns-controller.svc:443/mutate?timeout=30s": x509: certificate specifies an incompatible key usage
Intenté actualizar la configuración del certificado a extendedKeyUsage = clientAuth pero no funcionó.
¿Alguna idea de cuál es el signerName y la configuración correctos para certificates.k8s.io/v1 apiVersion?
No he logrado crear un CertificateSigningRequest como deseaba, SIN EMBARGO evité el problema al crear mi propia CA de la siguiente manera:
Primero, commonName el archivo de configuración de mi certificado para que incluya un nombre común y un uso de clave extendedKeyUsage actual:
cat > csr.conf <<EOF [req] req_extensions = v3_req distinguished_name = req_distinguished_name prompt = no [req_distinguished_name] CN = s-controller.ns-controller.svc [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth, serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = s-controller.ns-controller DNS.2 = s-controller.ns-controller.svc EOF Generar certificado de CA (observe los -days 365 )
openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -days 365 -out ca.crt -subj "/CN=admission_ca"Generar clave tls y fecha de certificado
openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr -config csr.conf openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -extensions v3_req -extfile csr.confCree un secreto tls de kubernetes para el webhook
kubectl create secret tls webhook-tls --cert=server.crt --key=server.key Establecer el CA_BUNDLE
export CA_BUNDLE=$(cat ca.crt | base64 | tr -d '\n')Eliminar todos los archivos generados
rm ca.crt rm ca.key rm server.key rm server.csr rm server.crt En mi webhhok, tengo un volume volumeMount :
volumen:
volumes: - name: tls-vol secret: secretName: webhook-tlsmontaje de volumen:
volumeMounts: - name: tls-vol mountPath: /etc/webhook/certs readOnly: true Y el comtainer args
args: - -tlsCertFile=/etc/webhook/certs/tls.crt - -tlsKeyFile=/etc/webhook/certs/tls.key¿Cómo crear un
CertificateSigningRequestcon apiVersioncertificates.k8s.io/v1para un webhook?
He creado con éxito certificates.k8s.io/v1 con los siguientes emisores y la configuración de openssl csr. Se probó con este ejemplo de webhook .
Por favor, consulte las configuraciones a continuación:
#csr.conf [req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth subjectAltName = @alt_names [alt_names] DNS.1 = ${service} DNS.2 = ${service}.${namespace} DNS.3 = ${service}.${namespace}.svcy:
#csr-for-webhook.yaml apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: ${csrName} spec: groups: - system:authenticated request: $(cat ${tmpdir}/server.csr | base64 | tr -d '\n') usages: - digital signature - key encipherment - client auth signerName: kubernetes.io/kube-apiserver-clientEn su antiguo CertificateSigningRequest yaml, estaba usando la autenticación del servidor como uno de los usos clave, pero en el último lo cambió a la autenticación del cliente . el certificado que necesita el webhook debe firmarse con la clave de autenticación del servidor y signerName debe ser kubernetes.io/kubelet-serving . Así que actualice sus archivos de la siguiente manera para evitar el problema:
csr.conf
cat > csr.conf <<EOF [req] req_extensions = v3_req distinguished_name = req_distinguished_name prompt = no [req_distinguished_name] CN = s-controller.ns-controller.svc [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth, serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = s-controller.ns-controller DNS.2 = s-controller.ns-controller.svc EOFGenere csr con subject.organization como "sistema: nodos"
openssl genrsa -out server.key 2048 openssl req -new -key server.key -subj "/CN=system:node:s-contoller.ns-controller.svc /OU="system:nodes" /O=system:nodes" -out $server.csr -config csr.confcsr-para-webhook.yaml
cat <<EOF | kubectl create -f - apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: csr-controller spec: groups: - system:authenticated request: $(cat server.csr | base64 | tr -d '\n') signerName: kubernetes.io/kubelet-serving usages: - digital signature - key encipherment - server auth EOFfuente: https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/
PD: Lo he probado con Kubernetes versión 1.21.3